Wenn du innerhalb des Worksheet_Change Events irgendwelche inhaltlichen Änderungen am Dokument / den Daten vornimmst, die wiederum zum Aufruf dieses Events führen, musst du sicherstellen das es zu keiner Endlosschleife kommt.
Im wesentlichen gibt es zwei Optionen, dem zu begegnen:
- Event-Handling verrübergehend ausschalten
- eine Barriere im Event setzen (ganz oben, bevor allen anderen Aufrufen)
- üblicherweise erstellt man dafür eine Member Variable (nur wenn es sinnvoll ist, sollte diese global sein)
- siehe folgendes Beispiel
private m_blnOnChange As Boolean 'Member-Variable / in Fällen wie diesen auch
'gerne als "Flag" bezeichnet
Private Sub Worksheet_Change(ByVal Target As Range)
If m_blnOnChange _
Then Exit Sub
m_blnOnChange = True 'Barriere / Flag aktiv
'<Anweisungen hier>
'z.B. Range("A1").Value = 1 '-> löst Worksheet_Change erneut aus
m_blnOnChange = False 'Barriere / Flag inaktiv
End Sub
Man sollte zusätzlich - wie auch bei Punkt 1 - berücksichtigen, dass aufgrund eines Laufzeitfehlers der Zustand nie zurück gesetzt werden könnte (Application.EnableEvents oder das Flag wird nicht zurück gesetzt) - deshalb unbedingt Fehlerbehandlung einplanen und dafür sorgen, dass man wieder in den Ausgangszustand zurück gelangt.
|